package Metier;

import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;

import Controle.Controleur;

/**
 * Classe de gestion des projets
 * @author Aubry Thomas
 * @author Bouchet Sylvain
 * @author Fauvel Alexis
 * @author Lessieur Jocelyn
 * @author Mathias Bastien 
 * @author Teuf Antoine
 * @version 1.0
 */

public class Projet implements Serializable{

	/**
	 * ArrayList contenant les pages du projet
	 * @see Projet#getPage(int)
	 * @see Projet#getPageByNom(String)
	 * @see Projet#getPageEnCours()
	 * @see Projet#getPages()
	 * @see Projet#creationPage(String)
	 * @see Projet#removePageByName(String)
	 * 
	 */
	private ArrayList<Page> alPage;
	
	/**
	 * nom du projet
	 * @see Projet#getNom()
	 * @see Projet#setNom(String)
	 */
	private String nom;
	
	/**
	 * auteur du projet
	 * @see Projet#getAuteur()
	 */
	private String auteur;
	
	/**
	 * index de la page en cours
	 */
	private Page pageEnCours;
	
	/**
	 * theme du projet
	 * @see Projet#getTheme()
	 * @see Projet#setTheme(Theme)
	 */
	private Theme theme;
	
	/**
	 * nom de la racine du projet
	 */
	private String racine;

	/**
	 * Constructeur de la classe projet
	 * @param cont		controleur du programme
	 * @param nom		nom du projet
	 * @param auteur	nom de l'auteur du projet
	 */
	public Projet(Controleur cont, String nom, String auteur) {
		racine = cont.getRacine()+"/";
		this.nom = nom;
		pageEnCours = null;
		File dir = new File(racine + nom);
		dir.mkdirs();

		alPage = new ArrayList<Page>();
		this.auteur = auteur;
		
		creationPage("Sans titre");
		
		theme=new Theme("Theme1", new Color(211,255,188), new Color(0,75,32), new Color(59,108,50), new Color(0,153,0), new Color(86,140,47), new Color(0,204,51));
		
		copier("/xsl/defaut.xsl", "defaut.xsl");
		copier("/xsl/sommaire.xsl", "sommaire.xsl");
		copier("/xsl/index.html", "index.html");
	}

	/**
	 * Permet de creer et ajouter une page au projet
	 * @param titre	titre de la page à ajouter
	 */
	public void creationPage(String titre) {
		Page p = new Page(racine, titre, this);
		alPage.add(p);
		new Sommaire(racine, this);
	}

	/**
	 * Permet de recuperer la page en cours
	 * @return la page en cours
	 */
	public Page getPageEnCours() {
		return pageEnCours;
	}
	
	/**
	 * Permet de recuperer une page depuis son index
	 * @param 	index	index de la page à retourner
	 * @return			la page dont l'index est passé en parametre
	 */
	public Page getPage(int index) {
		pageEnCours = alPage.get(index);
		return pageEnCours;
	}

	/**
	 * Permet de recuperer la liste des pages
	 * @return	l'arraylist contenant les pages
	 */
	public ArrayList<Page> getPages() {
		return alPage;
	}

	/**
	 * Permet de recuperer le nom du projet
	 * @return	nom du projet dans un String
	 */
	public String getNom() {
		return nom;
	}
	
	/**
	 * Permet de recuperer le nom de l'auteur
	 * @return	nom de l'auteur dans un String
	 */
	public String getAuteur(){
		return auteur;
	}

	/**
	 * Permet la copie d'un fichier
	 * @param source		chemin du fichier a copier
	 * @param destination	chemin de la destination depuis le dossier du projet
	 */
	public void copier(String source, String destination) {
		InputStreamReader in;
        OutputStream out=System.out;
        int c=0;
        
        try {
        	in = new InputStreamReader(getClass().getResourceAsStream(source));
        	out=new FileOutputStream(racine+nom +"/"+destination);
        	
        	while ((c=in.read())!=-1)
        		out.write(c);
        	
        	in.close();
            out.close();
            
		} catch (Exception e) {	
			System.out.println(e.toString());
		}
	}

	/**
	 * Permet de recuperer une page depuis son nom
	 * @param 	nom		nom de la page a recuperer
	 * @return			la page dont le nom est passé en parametre
	 */
	public Page getPageByNom(String nom) {
		for (Page page : alPage)
			if (page.getTitrePage().equals(nom))
				return page;
		return getPageEnCours();
	}

	/**
	 * Permet de supprimer une page depuis son nom
	 * @param nom	nom de la page à supprimer
	 */
	public void removePageByName(String nom){
		alPage.remove(getPageByNom(nom));
	}
	
	/**
	 * Permet de remplacer le contenu la page en cours par celui d'une autre page
	 * @param page	nouvelle page à mettre à la place de l'ancienne
	 */
	public void setPageEnCours(Page page) {
			pageEnCours=page;
	}
	
	/**
	 * Permet de modifier le theme du projet
	 * @param t	nouveau Theme du projet
	 */
	public void setTheme(Theme t){
		theme=t;
	}
	
	/**
	 * Permet de recuperer le theme du projet
	 * @return	le Theme du projet
	 */
	public Theme getTheme(){
		return theme;
	}

	/**
	 * Permet d'afficher le contenu de l'element projet
	 * @return	contenu du projet dans un String
	 */
	public String toString() {
		return "Projet [nom=" + nom + ", auteur=" + auteur + "]";
	}
	
	/**
	 * Peremet de modifier le nom du projet
	 * @param nom	nouveau nom du projet
	 */
	public void setNom(String nom){
		this.nom=nom;
	}
	
	/**
	 * Permet de generer le projet complet
	 * @return	le nombre de pages generées
	 */
	public int genererTout(){
		int i=0;
		String nomFichier;
		for(Page p:alPage){
			nomFichier=nom+"Page"+ ++i;
			p.enregistre(nomFichier);
		}
		return i;
	}
	
}